<?php
require_once "interface/Gi_Router_interface.php";
require_once "Gi_Controller_Front.php";

abstract class Gi_Router_Abstract implements Gi_Router_Interface{
  private $_request = null;
  private $_default_module = "default";
  private $_default_controller = "index";
  private $_default_action = "index"; 
  
  private $_content_module = "CMS";
  private $_content_controller = "CMS";
  private $_content_action = "CMS";
  
  /**
  * @var Gi_Controller_Front
  */
  private $_front_controller = null;
  
  public function __construct (Gi_Request_interface $request) {
    $this->set_request($request);
    $this->_front_controller = Gi_Controller_Front::get_instance();
  }
  
  /**
  * @desc Para setear el request a utilizar
  * @param Gi_Request_Interface El objeto request
  */
  public function set_request (Gi_Request_interface $request) {
    $this->_request = $request;
  }
  
  /**
  * @desc obtiene el objeto Request
  * @return Gi_Request_Interface | NULL Objeto request o null
  */
  public function get_request () {
    if ($this->_request !== null)
      return $this->_request;
    throw new Gi_Exception("EL objeto request no se ha definido aun");
  }
  
  /**
  * @desc setea el default module
  */
  public function set_default_module ($module) {
    $this->_default_module = $module;
  }
  
  /**
  * @desc Obtiene el default module
  */
  public function get_default_module () {
    return $this->_default_module;
  }
  
  /**
  * @desc setea el default Controller
  */
  public function set_default_controller ($controller) {
    $this->_default_controller = $controller;
  }
  
  /**
  * @desc Obtiene el default controller
  */
  public function get_default_controller () {
    return $this->_default_controller;
  }
  
  /**
  * @desc setea el default action
  */
  public function set_default_action ($action) {
    $this->_default_action = $action;
  }
  
  /**
  * @desc Obtiene el default action
  */
  public function get_default_action () {
    return $this->_default_action;  
  }
  
  /**
  * @desc Setea la ruta
  */
  public function set_route () {
    //obtenemos url de la peticion
    $url = $this->_request->get_url();
    
    //transformamos la url en un array
    $arr_url = explode("/",$url);
    
    
    //limpia la url cuando vienen barras seguidas por ejemplo http://localhos/pepe//////pepe/pe2
    while ($arr_url[0] !== null) {
      while ($arr_url[0] == "") {
        array_shift($arr_url);
        if (!isset($arr_url[0]))
          break;
      }
      $arr_url_clean[] = array_shift($arr_url);
    }
    
    //obtenemos del front controller el directorio de aplicacion por default "app""
    $app_dir = $this->_front_controller->get_app_dir();
    
    //obtenemos un valor de la url
    $module = array_shift($arr_url_clean);
    //bugfix para cuando la url viene vacia
    if ($module === null) {
      $module = $this->_default_module;
    }
    /*esta parte chequea si en la ruta viene un nombre de archivo *.html*/
    else if (eregi('(.*)[.]html',$module,$regs)) {
      $cmd = $regs[1];
      $this->_request->set_module($this->_content_module); 
      $this->_request->set_controller($this->_content_controller);
      $this->_request->set_action($this->_content_action);       
      $this->_request->set_params(array("cmd" => $cmd));
      return;
    }
    
    //verificamos si existe el directorio, si existe entonces el parametro se toma como modulo si no, se pregunta si exister el directorio default_module si existe se utiliza este y si no existe se asume que no hay directorios de modulos y se toma como controller
    if (!is_dir($app_dir . DIRECTORY_SEPARATOR . $module)) {
      if (!is_dir($app_dir . DIRECTORY_SEPARATOR . $this->_default_module)) {
        $this->_request->set_module(false);                         
      }
      else {
        $this->_request->set_module($this->_default_module);
      }
      $mod = false;
    }
    else {
      $this->_request->set_module($module);
      $mod = true;
    }
    if ($module) {
      //seteamos el controller
      if ($mod) {
        $controller = array_shift($arr_url_clean);
      }
      else {
        $controller = $module;
      }
      if (isset($controller)) {
        $this->_request->set_controller($controller);
      }
      else {
        $this->_request->set_controller($this->_default_controller);
      }
      //seteamos el action
      $action = array_shift($arr_url_clean);
      if (isset($action)) {
        $this->_request->set_action($action);
      }
      else { 
          $this->_request->set_action($this->_default_action);
      }
      
      //seteamos el resto como parametros
      while ($p = array_shift($arr_url_clean)) {
        $arr_p [$p] = array_shift($arr_url_clean);
        $this->_request->set_params($arr_p);
      }
    }
    else {
      //vino url vacia
      $this->_request->set_controller($this->_default_controller);
      $this->_request->set_action($this->_default_action);
    }
    return $this;
  }                            
  
  public function set_content_module ($module) {
    $this->_content_module = $module;
  }
  
  /**
  * @desc Obtiene el content module
  */
  public function get_content_module () {
    return $this->_content_module;
  }
  
  /**
  * @desc setea el content Controller
  */
  public function set_content_controller ($controller) {
    $this->_content_controller = $controller;
  }
  
  /**
  * @desc Obtiene el content controller
  */
  public function get_content_controller () {
    return $this->_content_controller;
  }
  
  /**
  * @desc setea el content action
  */
  public function set_content_action ($action) {
    $this->_content_action = $action;
  }
  
  /**
  * @desc Obtiene el content action
  */
  public function get_content_action () {
    return $this->_content_action;  
  }
  
}
